<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>json的序列化(The serialization of JSON)</title>
  <!-- 
  在JavaScript中，JSON（JavaScript Object Notation）是一种轻量级的数据交换格式，广泛用于客户端和服务器之间的数据传输。JSON的序列化是将JavaScript对象转换为JSON字符串的过程，这样可以方便地在网络上传输或存储。
  1. JSON序列化的基本概念
  - 序列化（Serialization）：将对象转换为字符串的过程。对于JSON来说，就是将JavaScript对象转换为符合JSON格式的字符串。
  - 反序列化（Deserialization）：将JSON字符串转换回JavaScript对象的过程。

  2. JSON序列化的方法
  在JavaScript中，可以使用JSON.stringify()方法进行序列化：
    const obj = {
      name: "张三",
      age: 30,
      isStudent: false,
      hobbies: ["阅读", "旅行"]
    };

    const jsonString = JSON.stringify(obj);
    console.log(jsonString); // 输出: {"name":"张三","age":30,"isStudent":false,"hobbies":["阅读","旅行"]}
    
  3. JSON.stringify()方法
  - 语法：JSON.stringify(value[, replacer[, space]])
  - 参数：
    - value：要序列化的JavaScript值（通常是对象或数组）。
    - replacer（可选）：一个函数或数组，用于控制哪些值应该被包含在序列化过程中。
    - space（可选）：用于控制输出的格式化（缩进），可以是数字或字符串，表示空格的数量。

  3.1. 基本序列化：
    const obj = { name: "李四", age: 25 };
    const jsonString = JSON.stringify(obj);
    console.log(jsonString); // 输出: {"name":"李四","age":25}
  3.2. 使用replacer：
    const obj = { name: "王五", age: 28, password: "123456" };
    const jsonString = JSON.stringify(obj, ["name", "age"]); // 只包含name和age
    console.log(jsonString); // 输出: {"name":"王五","age":28}
  3.3. 使用space进行格式化：
    const obj = { name: "赵六", age: 22 };
    const jsonString = JSON.stringify(obj, null, 2); // 使用2个空格缩进
    console.log(jsonString);
    /*
    输出:
    {
      "name": "赵六",
      "age": 22
    }
    */

  4. 注意事项
  - 循环引用：如果对象中存在循环引用（即对象直接或间接引用自身），JSON.stringify()将抛出错误。
  - 不可序列化的值：某些值无法被序列化，如undefined、函数、Symbol和特殊对象（如Date、Map、Set等）。它们在序列化时会被忽略或转换为null。
  - 日期对象：Date对象在序列化时会转换为ISO 8601格式的字符串。例如：
    const date = new Date();
    const jsonString = JSON.stringify({ date });
    console.log(jsonString); // 输出: {"date":"2023-10-01T12:00:00.000Z"}
  总结
  JSON序列化是JavaScript中将对象转换为JSON字符串的过程，主要通过JSON.stringify()方法实现。理解JSON序列化的概念和使用方法对于数据交换、存储和API开发非常重要。通过合理使用序列化功能，开发者可以有效地处理和传输数据。
  -->
</head>
<body>

  <script>
    const obj = { name: "张三", age: 30, friend: { name: "李四", age: 25 }};

    // 1. 序列化: JSON.stringify()方法将JavaScript对象转换为JSON字符串
    const jsonString = JSON.stringify(obj);
    console.log(jsonString); // 输出: {"name":"张三","age":30,"friend":{"name":"李四","age":25}}

    localStorage.setItem("user", jsonString);

    // 2. 反序列化: JSON.parse()方法将JSON字符串转换为JavaScript对象
    const user = localStorage.getItem("user");
    
    const parsedObj = JSON.parse(user);
    console.log(parsedObj); // 输出: { name: '张三', age: 30, friend: { name: '李四', age: 25 } }

  </script>
  
</body>
</html>